﻿using System;
using System.Collections.Generic;

namespace Vowei.Core
{
    public class Constants
    {
        public static class BuiltIn
        {
            public static class Users
            {
                /// <summary>
                /// 整个站点默认的管理员
                /// </summary>
                public const string Administrator = "administrator@vowei.com";

                /// <summary>
                /// 整个站点，如果任务没有指定到具体的员工，则都会指定到这个帐号下面
                /// </summary>
                public const string Active = "Active";
            }

            /// <summary>
            /// 系统自带的用户组(角色Role)的名字
            /// </summary>
            public static class Roles
            {
                /// <summary>
                /// 管理员，整个网站的管理员，拥有最高权限
                /// </summary>
                public const string Administrators = "Administrators";

                /// <summary>
                /// 项目经理组，只能在本公司范围内创建新项目。
                /// </summary>
                /// <remarks>
                /// 拥有以下这些权力：
                /// 
                /// 创建、修改、关闭项目，里程碑、需求，任务，Bug，风险
                /// 执行项目的挣值分析统计，以及一系列与自己项目相关的统计
                /// 导入、修改、创建和删除团队成员
                /// 分配团队成员针对本项目的访问权限
                /// 浏览项目进度
                /// </remarks>
                public const string ProjectManagers = "Project Managers";

                /// <summary>
                /// 客户组，只能访问自己项目相关的信息，不能访问统一项目经理下其它项目的信息。
                /// </summary>
                /// <remarks>
                /// 客户组的用户，只能访问指定公司，指定项目经理下某一个项目（属于自己的项目）的信息，不能访问
                /// 其它公司，其他项目的信息
                /// 
                /// 拥有以下这些权力：
                /// 打开、修改和关闭需求，但是要按照需求变更管理的流程来实现
                /// 浏览项目进度
                /// </remarks>
                /// TODO: 将客户引入到项目管理流程中，一定要放在系统成熟后实现
                public const string Customers = "Customers";

                /// <summary>
                /// 过客组，只能浏览项目具体任务相关的信息，以及项目团队成员信息
                /// </summary>
                /// <remarks>
                /// 拥有以下这些权力：
                /// 
                /// 浏览任务的详细信息，以及相关评论。
                /// 浏览团队成员信息
                /// </remarks>
                public const string Viewers = "Viewers";

                /// <summary>
                /// 公司上层经理组，可以浏览项目组的详细信息，以及相关的统计信息
                /// </summary>
                /// <remarks>
                /// 拥有以下这些权力：
                /// 
                /// 浏览项目，里程碑、需求，任务，Bug，风险的详细信息
                /// 可以访问到项目的挣值分析统计等相关成本统计数据
                /// 可以浏览项目团队成员
                /// 浏览项目进度
                /// </remarks>
                public const string UpperManagers = "Upper Managers";

                /// <summary>
                /// 团队成员组
                /// </summary>
                /// <remarks>
                /// 拥有以下这些权力：
                /// 
                /// 创建、修改、关闭任务，Bug，风险
                /// 浏览项目进度
                /// </remarks>
                public const string Contributors = "Contributors";
            }

            public static class PermissionSet
            {
                // TODO: 这个常量可以考虑放到PermissionSet里面去，但是感觉Permission类里包含常量有点污染
                public static string ManageProjectPermissionSet = "管理项目";

                public static string ProjectMemeberPermissionSet = "项目成员";

                public static string ProjectViewerPermissionSet = "浏览项目状态";
            }

            public static class ResouceCalendar
            {
                public static readonly Guid StandardCalendarId = new Guid("00000000-0000-0000-1000-000000000000");
                public static readonly Guid NightShiftCalendarId = new Guid("00000000-0000-0000-1000-000000000001");
                public static readonly Guid TwentyFourHoursCalendarId = new Guid("00000000-0000-0000-1000-000000000002");
            }
        }

        public static class Permission
        {
            public static class Read
            {
                public const string Project = "ReadProject";

                public const string Milestone = "ReadMilestone";

                public const string Requirement = "ReadRequirement";

                public const string Task = "ReadTask";

                public const string Bug = "ReadBug";

                public const string Risk = "ReadRisk";

                public const string MeetingRequest = "ReadMeetingRequest";

                public const string Comment = "ReadComment";

                public const string ChangeSet = "ReadChangeSet";

                public const string Permission = "ReadPermission";

                public const string PermissionSet = "ReadPermissionSet";

                public const string Ace = "ReadAce";
            }

            public static class Write
            {
                public const string Project = "WriteProject";

                public const string Milestone = "WriteMilestone";

                public const string Requirement = "WriteRequirement";

                public const string Task = "WriteTask";

                public const string Bug = "WriteBug";

                public const string Risk = "WriteRisk";

                public const string MeetingRequest = "WriteMeetingRequest";

                public const string Permission = "WritePermission";

                public const string PermissionSet = "WritePermissionSet";

                public const string Ace = "WriteAce";
            }
        }
    }
}